home *** CD-ROM | disk | FTP | other *** search
- % This is PROGLTX.DOC as of 25 May 90
- %---------------------------------------------------------
- % (c) 1989,1990 by J.Schrod. copy conditions see below
-
- %
- % Macro package for the documentation of programs
- % LaTeX style option
- % MAKEPROG is needed
- %
-
- %
- % DATE PERSON REMARK
- % 89-11-18 js repaired the handling of `|' (verbatim and \index).
- % 89-10-05 js first version (for TeX89)
- %
-
- % author's current address:
- %
- % Detig$\,\cdot\,$Schrod \TeX{}sys
- % Joachim Schrod
- % Kranichweg 1
- %
- % D-6074 R\"odermark-Urberach
- % FR Germany
- %
- % Tel. (+6074) 1617
- % Bitnet: XITIJSCH@DDATHD21
-
-
-
- % documented with itself...
- %%%%
- %%%%
- %%%% These TeX macros were documented with the documentation system
- %%%% MAKEPROG and automatically converted to the current form.
- %%%% If you have MAKEPROG available you may transform it back to
- %%%% the original input: Remove every occurence of three percents
- %%%% and one optional blank from the beginning of a line and remove
- %%%% every line which starts with four percents. The following lex
- %%%% program will do this:
- %%%%
- %%%% %%
- %%%%
- %%%% ^%%%\ ? ;
- %%%% ^%%%%.*\n ;
- %%%%
- %%%% MAKEPROG may be obtained over the net from the Bitnet-Listserver
- %%%% LISTSERV@DHDURZ1 (filelist WEBWARE), from tuglib@science.utah.edu,
- %%%% or via ftp from june.cs.washington.edu.
- %%%%
- %%%%
- %%% \documentstyle[progltx]{article}
-
-
- %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%% %
- %%% % local macros
- %%% %
-
- %%% \let\mc=\small % for names like GNU
-
- %%% \def\WEB{{\tt WEB\/}}
- %%% \def\GNU{{\mc GNU}}
-
- %%% %
- %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
- %%% \begin{document}
-
-
- %%% \title{
- %%% Documenting programs in a \WEB{} style\\
- %%% The {\tt progltx\/} style option
- %%% }
- %%% \author{\sc Joachim Schrod}
-
- %%% \maketitle
-
-
- %%% \chap Introduction.
-
- %%% \WEB{} systems allow the documentation of programs by supporting the
- %%% separation in program fragments which can be collected and rearranged
- %%% afterwards. This allows {\it top-down\/} programming as well as the
- %%% {\it bottom-up\/} design of programs. Each program fragment can be
- %%% documented, usually with \TeX{}\@. A disadvantadge is that \WEB{}
- %%% actually exists only for a few programming languages (Pascal, C,
- %%% Modula-2). Besides, building up \WEB{} systems for ``exotic''
- %%% programming languages like \TeX{} is very difficult.
-
- %%% This macro package was built to allow good documentation for programs
- %%% in languages for which \WEB{} doesn't exist. It separates a program
- %%% text in sections that can be documented. All sections, collected
- %%% sequentially, will result in the complete program. In every section
- %%% begin and end of the program part are marked with |\beginprog| and
- %%% |\endprog|, this program part will be formatted as it is input
- %%% (``verbatim'').
-
- %%% Originally these macros were written for the usage with Plain \TeX{}
- %%% resp.\ on top of the \WEB{} macro package |webmac.tex|. But often the
- %%% requirement has been told to me that a \LaTeX{} version would be
- %%% useful, too---well, here it is. But even with \LaTeX{} I have decided
- %%% that still |\beginprog| and |\endprog| must be used for the markup of
- %%% the program parts, not |\begin{prog}| or |\end{prog}| which would be
- %%% more ``\LaTeX{}-like.'' The reason behind this is that I didn't want
- %%% to maintain two versions of the {\mc MAKEPROG\/} processor---but {\mc
- %%% MAKEPROG\/} wants to see the non-\LaTeX{}-like macros. But everybody
- %%% is encouraged to change it by themselves (it is {\it very\/} easy).
-
- %%% The user of these macros may use the usual sectioning macros of
- %%% \LaTeX{} for structuring his documentation. Additionally we provide a
- %%% |progdoc|-compatible (i.e.\ \WEB{}-like) markup with the two macros
- %%% |\chap| and |\sect|.
-
- %%% In the documentation part of a section text pieces, e.g.\ names of
- %%% variables, can be inserted verbatim to demonstrate the connection to
- %%% the program text. These parts are included in vertical bars
- %%% (`{\tt\vbar}') This makes this style option extremely useful if your
- %%% identifiers (or your file names) include characters which would be
- %%% special characters for \TeX{} otherwise. (One example of these
- %%% program languages is \TeX{} itself, but just enclose the macro names
- %%% in vertical bars and {\tt \vbar|\relax|\vbar}.)
-
- %%% The macros |\makevertother| and |\makevertactive| are available to
- %%% activate and deactivate the special behaviour of the vertical bar but
- %%% these macros should be needed seldom because the usual cases as the
- %%% usage within |verbatim| and |tabular| environments or |\index| macros
- %%% etc.\ are handled.
-
- %%% If a vertical bar must be used in the original fashion you can use two
- %%% command sequences: |\origvert| holds the meaning of the vertical bar
- %%% at the time this macro file was read in and |\vbar| is the character
- %%% with the {\mc ASCII\/} code of the vertical bar (i.e.~|"EC|) in the
- %%% current font.
-
- %%% The new notion of |\verb| must not be used within parameters of
- %%% macros, e.g.\ in the argument of |\section| etc.---it will result in
- %%% an error message by \TeX{}\@. Furthermore within the preamble of a
- %%% |tabular|, an |array| environment, or the |\multicolumn| command the
- %%% vertical bar has the same meaning as before. (That means within
- %%% |@{|\ldots|}| it is an ordinary character and otherwise it specifies a
- %%% vertical rule between the columns.
-
- %%% This macro package does not offer the automatic creation of an index
- %%% because it is not known which syntactical tokens the language has that
- %%% should be mentioned in an index. But of course all \LaTeX{} stuff like
- %%% |\index|, |\tableofcontents|, etc.\ may be used.
-
-
- %%% \sect This program is free software; you can redistribute it and/or
- %%% modify it under the terms of the \GNU{} General Public License as
- %%% published by the Free Software Foundation; either version~1, or (at your
- %%% option) any later version.
-
- %%% This program is distributed in the hope that it will be useful, but
- %%% {\bf without any warranty\/}; without even the implied warranty of
- %%% {\bf merchantability\/} or {\bf fitness for a particular purpose}. See
- %%% the \GNU{} General Public License for more details.
-
- %%% You should have received a copy of the \GNU{} General Public License
- %%% along with this program; if not, write to the Free Software Foundation,
- %%% Inc., 675~Mass Ave, Cambridge, MA~02139, USA.
-
-
- %%% \sect We have to realize three parts: (1)~the formatting of rather
- %%% small verbatim texts in a line, (2)~the formatting of larger parts of
- %%% program and (3)~the document structuring elements for the separation
- %%% of the sections.
-
- %%% \begin{sloppypar}
- %%% Before we start we declare some shorthands for category codes. By
- %%% declaring the underscore~`(|_|)' as a letter we can use it in our
- %%% macros names. (I agree with D.~Knuth that
- %%% |\identifier_several_words_long| is more readable than
- %%% |\IdentifierSeveralWordsLong| and in every case better than
- %%% |\p@@@s|.) But as we have to restore the category codes at the end
- %%% of this macro file we store its former value in the control
- %%% sequence |\uscode|. This method is better than the usage of a
- %%% group because not all macros have to be defined global this way.
- %%% \end{sloppypar}
-
- %%% \beginprog
- \chardef\escape=0
- \chardef\open=1
- \chardef\close=2
- \chardef\letter=11
- \chardef\other=12
- %\chardef\active=13 % is defined in Plain already
-
- \chardef\uscode=\catcode`\_
-
- \catcode`\_=\letter
- %%% \endprog
-
-
-
-
- %%% \chap Local Verbatim Formatting.
-
- %%% The main point of every verbatim formatting is the switching of the
- %%% character codes of all characters that have a special \TeX{} meaning.
- %%% This can be done with the control sequence |\dospecials| that applies
- %%% the control sequence |\do| to all special characters. Additionally,
- %%% every line is regarded as a paragraph without indentation. Between
- %%% two paragraphs, i.e.\ between two lines, no extra space is set.
- %%% Finally all blanks and tabular characters shall be obeyed and the
- %%% inter word space after sentence terminators shall not be enlarged.
- %%% The activation of the tabular characters with |\obeytabs| is
- %%% equivalent to |\obeyspaces| in {\tt plain.tex}.
-
- %%% \begin{sl}
- %%% As a matter of fact, I would like to use the character set with the
- %%% extended {\mc ASCII} (like in\/ \WEB{}) for setting the verbatim texts
- %%% in monospace. But then I must code many\/ |\@getfont|'s\,\dots
- %%% \end{sl}
-
- %%% \beginprog
- %\font\tentex=cmtex10 % typewriter extended ASCII 10pt
- %\let\ttex=\tentex % only with base size 10pt
- \def\ttex{\tt} % as a substitute
-
- \def\setup_verbatim{%
- \def\do##1{\catcode`##1\other}\dospecials
- \parskip\z@skip \parindent\z@
- \catcode`\`\active \@noligs
- \obeylines \@vobeyspaces \obeytabs \frenchspacing
- \ttex
- }
-
- \let\tab=\space
- \begingroup
- \catcode`\^^I=\active% % Attention: no tabs!
- \gdef\obeytabs{\catcode`\^^I=\active\def^^I{\tab}}
- \global\let^^I=\tab% % if an active tab appears in a \write
- \endgroup
- %%% \endprog
-
-
- %%% \sect After having saved the old meaning of `{\tt\vbar}' in
- %%% |\origvert| and after declaring |\vbar| as a synonym for the character
- %%% that has the code of a vertical bar in the actual font, the vertical
- %%% bar can be made active. Then we call |\setup_verbatim|. But the
- %%% newline characters shall not be processed, they shall be regarded like
- %%% blank space. This can be reached by defining |\par| as |\space|.
-
- %%% The next vertical bar in the input closes the group which becomes an
- %%% (unbreakable) |\hbox| then. The old meanings of the special
- %%% characters and of the vertical bar are restored and \TeX{} is in
- %%% normal (horizontal) mode again.
-
- %%% \beginprog
- \let\origvert=|
- \chardef\vbar=`\|
-
- \def\makebaractive{\catcode`\|\active}
- \def\makebarother{\catcode`\|\other}
- \makebaractive
-
- \def|{%
- \leavevmode
- \hbox\bgroup
- \let\par\space \setup_verbatim
- \let|\egroup
- }
- %%% \endprog
-
-
- %%% \sect A problem with this definition of the vertical bar is that
- %%% the bar is not a normal character any more but there exists situations
- %%% where the \LaTeX{} macros assumes this:
- %%% %
- %%% \begin{itemize}
-
- %%% \item In a |verbatim| environment a vertical bar must be typeset if it
- %%% occurs in the input.
-
- %%% \item In a |tabular| or an |array| environment a vertical bar is used
- %%% to denote rules between columns in the table. These environments must
- %%% be started with a parameter which is a ``preamble,'' the same preamble
- %%% construction is used to specify the format of multi-column entries.
-
- %%% \item In an output of an index entry the vertical bar must not result
- %%% in an error message. Usually index entries are typeset in a seperate
- %%% \TeX{} run where |idverb| is not used as a style option and the
- %%% vertical bar is therefore useful. This is no problem in section
- %%% headings or captions etc. Because they take their argument as a
- %%% parameter in every case the vertical bar can never be used there. But
- %%% |\origvert| resp.\ |\vbar| may be used there.
-
- %%% \end{itemize}
- %%% %
- %%% In the next sections we handle each of these problems.
-
-
- %%% \sect Before we start a |verbatim| environment we just redefine the
- %%% vertical bar as an ordinary character. Because this is within the
- %%% environment grouping the end of the environment will reestablish the
- %%% special meaning.
-
- %%% \beginprog
- \let\@@verbatim=\@verbatim
- \def\@verbatim{%
- \makebarother
- \@@verbatim
- }
- %%% \endprog
-
-
- %%% \sect Special care is needed in the |tabular| and the |array|
- %%% environment. Both environments are begun by one macro (|\@tabarray|),
- %%% we redefine it so that the bar can be used in the preamble
- %%% specification. The same problem occurs in |\multicolumn|, it is
- %%% solved the same way. After the preamble construction (with
- %%% |\@mkpream|) the special meaning of the bar can be switched on
- %%% again---this allows the usage of the new meaning in the body of a
- %%% table.
-
- %%% Of course this mean that the ``verbatim identifier'' facility can
- %%% not be used within a preamble of a table. Furthermore it can not
- %%% be used within the |\multicolumn| statement, neither in the
- %%% preamble part (the second parameter) nor within the text part (the
- %%% third parameter).
-
- %%% \beginprog
- \let\@@tabarray=\@tabarray
- \def\@tabarray{%
- \makebarother
- \@@tabarray
- }
-
- \def\multicolumn#1{%
- \multispan{#1}%
- \begingroup
- \makebarother
- \restof_multicolumn
- }
- \def\restof_multicolumn#1#2{%
- \@mkpream{#1}%
- \def\@sharp{#2}%
- \let\protect\relax
- \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox
- \@arstrut \@preamble
- \endgroup
- \ignorespaces
- }
-
- \let\@@mkpream=\@mkpream
- \def\@mkpream#1{%
- \@@mkpream{#1}%
- \makebaractive
- }
- %%% \endprog
-
-
- %%% \sect Before an index entry is scanned almost all special characters
- %%% are transformed into ordinary characters. The only exceptions are the
- %%% opening and the closing brace because they are needed to delimit the
- %%% argument. This transformation is done with |\@sanitize|, this macro
- %%% must be called within a group. We just append the transformation of
- %%% the vertical bar.
-
- %%% \beginprog
- \begingroup
- \def\@makeother{\noexpand\@makeother\noexpand}
- \xdef\@sanitize{\@sanitize\@makeother\|}
- \endgroup
- %%% \endprog
-
-
-
-
- %%% \chap Fragments in Verbatim.
-
- %%% We need macros to format the program fragments without any
- %%% linebreaking. Such a text area shall start with the macro
- %%% |\beginprog| and end with |\endprog|, i.e.\ as a kind of a
- %%% |prog|-environment. The macro |\endprog| must stand at the very
- %%% beginning of a line and must be followed by white space (blank, tab or
- %%% newline character). After |\beginprog| as well as after
- %%% |\endprog| the rest of the line is ignored.
-
- %%% Two demands must be regarded: There should be no length restrictions
- %%% for the processed text, and the tabular characters should be expanded
- %%% so that this macro works on PC's and on VAXes etc., too.
-
-
- %%% \sect The implementation method is quite simple: We read the next
- %%% line, test, wether the end is reached (by comparing with the end line)
- %%% and otherwise set the line actually read. Every character is
- %%% inspected and tabular characters are expanded.
-
- %%% The verbatim text is started with |\begin_verbatim| which will be
- %%% either called by |\beginprog| or by |\beginverbatim|. These macros
- %%% will also define the contents of the end line.
-
- %%% Whether a line is set or whether the end of the processed area is
- %%% reached is indicated by the switch |\if@print|. At the beginning of
- %%% the |\begin_verbatim| macro most settings are done with
- %%% |\setup_verbatim| (the vertical bar must be handled separately)
- %%% and the rest of the line is ignored. As everything is done within
- %%% a group, the end of the verbatim text can be processed by simply
- %%% closing this group.
-
- %%% For the user it looks as if |\endprog| or |\endverbatim|
- %%% terminates the processing, but it just serves for the
- %%% identification of the end, the true processing is done with the
- %%% internal macro |\end_verbatim|.
-
- %%% \beginprog
- \newif\if@print
-
- \def\begin_verbatim{%
- \endgraf
- \bigbreak
- \begingroup
- \setup_verbatim \makebarother
- \@printtrue
- \ignore_rest_line
- }
- \let\end_verbatim=\endgroup % internal command !
- %%% \endprog
-
-
- %%% \sect {\sloppy
- %%% The first line is ignored, all the other lines are identified with
- %%% |\set_next_line| and processed with |\do_set|. This separation in
- %%% identification and processing allows that the line end character is
- %%% active in the definition only for a short time.
- %%% \par}
-
- %%% When a line is to be formatted, we first check with |\check_print|
- %%% wether it contains the end line, otherwise it is printed with
- %%% |\print_char|. The printing must be done for every character
- %%% individually because we want to check for tabular characters; the
- %%% exact algorithm is described below. Here we just have to note that
- %%% |\print_char| is used with two parameters of which the second one is
- %%% finished with the token |\end_line|. The first parameter is the first
- %%% character of the line, the second parameter is the rest of the line.
- %%% If the line is empty, the argument of |\do_set| is empty, too; so the
- %%% activation of |\print_char| must be finished with two |\end_line|.
- %%% Then the first |\end_line| is the first argument for |\print_char| and
- %%% the second argument is empty. But if the line did contain something,
- %%% the second |\end_line| is evaluated, for this case it is defined as
- %%% |\relax|.
-
- %%% At last we call |\set_next_line| again to format the next line. If
- %%% the end is reached, i.e.\ if the sample line was found,
- %%% |\set_next_line| will be redefined as |\relax|. This can be done
- %%% because the original meaning is restored while closing the group
- %%% with |\end_verbatim|.
-
- %%% \beginprog
- \begingroup
- \obeylines% % ^^M is active! ==> every line must end with %
- \gdef\ignore_rest_line#1^^M{\set_next_line}%
- \gdef\set_next_line#1^^M{\do_set{#1}}%
- \endgroup
-
- \def\do_set#1{%
- \endgraf
- \check_print{#1}%
- \if@print \indent \print_char#1\end_line\end_line
- \else \let\set_next_line\end_verbatim
- \fi
- \set_next_line
- }
- \let\end_line=\relax
- %%% \endprog
-
-
- %%% \sect {\sloppy
- %%% Before we look at the problem of formatting a line, we declare
- %%% |\check_print| that checks the end of the verbatim mode. We have to
- %%% do two things: we must split everything in front of the first blank
- %%% or tabular character and compare for identity with |\endprog|. The
- %%% splitting is easy because the line which is our first argument
- %%% contains blanks and tabulators as active characters. First we call
- %%% |\cut_at_tab| that demands a tabular character as separator for its
- %%% two pramenters so that everything in the line in front of the first
- %%% tabulator is part of the first parameter. If there is no tabular
- %%% character in the line, we append one so that the second parameter is
- %%% empty. The same trick is used to separate the part in front of the
- %%% first blank character from the resulting first part.
- %%% \par}
-
- %%% The check is done with |\do_check|. We use a separate macro here so
- %%% that we can indent it (in the following definition blanks are active!)
-
- %%% \beginprog
- \begingroup
- \obeyspaces\obeytabs
- \gdef\check_print#1{\cut_at_tab#1^^I\end_line}
- \gdef\cut_at_tab#1^^I#2\end_line{\check_first_part#1 \end_line}% blank !
- \gdef\check_first_part#1 #2\end_line{\do_check{#1}}
- \endgroup
- %%% \endprog
-
-
- %%% \sect
- %%% \begin{sloppypar}
- %%% |\do_check| compares the line with a sample line that is
- %%% available in |\end_verbatim_line|. This macro will be defined later.
- %%% \end{sloppypar}
-
- %%% \beginprog
- \def\do_check#1{%
- \def\@line{#1}%
- \ifx \@line\end_verbatim_line \@printfalse
- \fi
- }
- %%% \endprog
-
-
- %%% \sect Now we can set a line: we start with the first character,
- %%% followed by the rest of the line. Each character is counted in
- %%% |\char_count|. At the beginning of a line |\char_count| is~0, this
- %%% is reset at the end of the line.
-
- %%% \beginprog
- \newcount\char_count \char_count\z@
-
- \def\print_char#1#2\end_line{%
- \print_first_char{#1}%
- \print_rest_of_line{#2}%
- }
- %%% \endprog
-
-
- %%% \sect For each character that is set |\char_count| is incremented.
- %%% If a character is a tabulator, we set with |\print_tab| the fitting
- %%% amount of blank characters, otherwise the character itself. We must
- %%% compare the character that is stored in |\@char| with a macro of which
- %%% the ``first-level'' expansion is an active tabulator. For this case
- %%% we declare |\@tab|.
-
- %%% \beginprog
- {\obeytabs\gdef\@tab{^^I}}
-
- \def\print_first_char#1{%
- \def\@char{#1}%
- \advance \char_count\@ne
- \ifx \@char\@tab \print_tab
- \else \@char
- \fi
- }
- %%% \endprog
-
-
- %%% \sect If we want to fill the line with blank spaces up to the next
- %%% column with a number that can be divided by~8, we must be able to
- %%% compute the column number modulo~8, but \TeX{} has no modulo operator.
- %%% So we define the macro |\mod_viii| that computes its argument modulo~8
- %%% and returns the result in the counter |\count_mod_viii|. For the
- %%% computation we need the temporary counter |\count@|.
-
- %%% \beginprog
- \newcount\count_mod_viii
- \def\mod_viii#1{%
- \count@ #1\relax \count_mod_viii\count@
- \divide \count@ 8\relax
- \multiply \count@ 8\relax
- \advance \count_mod_viii -\count@
- }
- %%% \endprog
-
-
- %%% \sect Now we can declare |\print_tab|. We must remember that
- %%% |\char_count| was incremented already, if we set only one blank
- %%% character the counter keeps untouched.
-
- %%% \beginprog
- \def\print_tab{%
- \loop \space \mod_viii\char_count
- \ifnum \count_mod_viii>\z@
- \advance \char_count\@ne
- \repeat
- }
- %%% \endprog
-
-
- %%% \sect If the rest of the line is empty, we are ready. |\char_count|
- %%% is reset to~0 for the next line.
-
- %%% Inside the |\else| part of |\ifx| |\print_char| should not be used
- %%% directly because this costs too much storage of \TeX{}\@. Instead we
- %%% set a control sequence |\next| that is processed afterwards, depending
- %%% on the result of the comparison. (This tail recursion will be
- %%% discovered by \TeX{} and handled appropriately.) If there is still
- %%% something to set, we use |\print_char| again, otherwise a
- %%% syntactically similar macro that expands to |\relax|.
-
- %%% \beginprog
- \def\print_rest_of_line#1{%
- \def\@line{#1}%
- \ifx \@line\empty \char_count\z@
- \def\next##1\end_line{\relax}%
- \else \let\next\print_char
- \fi
- \next#1\end_line
- }
- %%% \endprog
-
-
- %%% \sect {\sloppy
- %%% Now we are ready to define the two ``user accessible'' macros
- %%% |\beginprog| and |\beginverbatim|. They must define the prototyp end
- %%% line |\end_verbatim_line| which will be compared against every line
- %%% in the verbatim text. During the definition of
- %%% |\end_verbatim_line| it must be cared for that the escape character~`|\|'
- %%% is a printable character: A comparison with |\ifx| demands identical
- %%% category codes. As a temporary escape character we use the slash.
- %%% \par}
-
- %%% \beginprog
- {\catcode`\/=\escape % / is temporary escape char
- \catcode`\\=\other
- /gdef/beginprog{%
- /gdef/end_verbatim_line{\endprog}%
- /begin_verbatim
- }
- /gdef/beginverbatim{%
- /gdef/end_verbatim_line{\endverbatim}%
- /begin_verbatim
- }
- } % here \endgroup can't be used
- %%% \endprog
-
-
-
-
- %%% \chap Document Structuring.
-
- %%% In addition to the normal \LaTeX{} structuring markups we will
- %%% provide a markup for a layout of the document that is like in
- %%% \WEB{}. This can be done easily. All sections are numbered, the
- %%% number of the next section is stored in the counter |section|. We
- %%% distinguish between main sections which start a group of sections
- %%% and between normal sections within a group.
-
- %%% The main sections are started with the macro |\chap|. It has one
- %%% parameter, the title of the section group. This parameter must be
- %%% terminated by a dot. We start a new page, typeset the title in
- %%% bold face and separate it from the section text with a |\medskip|.
- %%% This text, the documentation part of the section, is formatted
- %%% without paragraph indentation.
-
- %%% If the \WEB{}-like macros are used every section number should be
- %%% output with a following dot. We want to establish this when we use the
- %%% |\chap| or the |\sect| macro the first time. Furthermore the new page
- %%% at the begin of a main section should not be started at the first
- %%% |\chap| because a title may precede it (and the title should not
- %%% be on a seperate page unless explicitely requested). Instead a
- %%% skip of (approximately) 2~pica should be set. To achieve
- %%% both goals a macro |\chap_intro| is defined that defines |\thesection|
- %%% appropriately, skips the 2~pica, and redefines itself to
- %%% |\newpage|---we then just have to call |\chap_intro| at the beginning
- %%% of |\chap|. The same applies to |\sect_intro|.
-
- %%% \beginprog
- \newskip\pre_sect_skip \pre_sect_skip=2pc plus 1pc minus 6pt
-
- \def\chap_intro{%
- \gdef\thesection{\arabic{section}.}%
- \gdef\chap_intro{\newpage}%
- \addvspace{\pre_sect_skip}%
- }
-
- \def\sect_intro{%
- \gdef\thesection{\arabic{section}.}%
- \global\let\sect_intro\relax
- }
- %%% \endprog
-
-
- %%% \sect Now we will have a look at the {\it wonderful\/} internal
- %%% interface of \LaTeX{}\@. With ``wonderful'' I mean that I'm always
- %%% full of wonder why it was designed in this way. E.g., if anybody
- %%% can explain to me why the coding of the non-indentation of the first
- %%% line in the following paragraph was combined with the coding of
- %%% the skip which will come in front of the section---I will be thankful
- %%% for the rest of my life. Such different things should be kept
- %%% different, i.e., the suppression of the indentation should not be
- %%% hidden in the sign of a skip! The same comment applies to the combined
- %%% coding of the skip below the section heading resp.\ to the right
- %%% of a run-in heading.
-
- %%% \begin{quote} \it
- %%% I want the following layout: no indentation in the following
- %%% paragraph\/ {\rm but no} space in front of the section heading.
- %%% How do I code a value of\/ $\sl -0 pt$?
- %%% \end{quote}
- %%% %
- %%% Well, a work-around is to use a value of $\rm -1\,sp$ because the
- %%% reader will not see this distance---but in my opinions this is no
- %%% good programming style. In this special case I have luck, too:
- %%% the skip is not set anyway, either it is discarded by the preceding
- %%% |\newpage| or it is not added by |\addvspace| because of the preceding
- %%% |\pre_sect_skip|.
-
- %%% \beginprog
- \def\chap#1.{%
- \chap_intro
- \@startsection{section}{1}%
- {\z@}%
- {\m@ne sp}%
- {\medskipamount}%
- {\normalsize\bf}%
- {#1.}%
- }
- %%% \endprog
-
-
- %%% \sect Normal sections are started with |\sect|. This macro has no
- %%% parameter. Between two paragraphs we skip |\pre_sect_skip|.
- %%% Between the section number and the text one quad of space is set.
- %%% We have to take care for empty documentation parts where the
- %%% program part (i.e.\ |\beginprog|) will follow immediately. Then
- %%% the program part should begin on a new line and not behind the
- %%% section number. So we provide |\null| as an empty documentation
- %%% part in every case.
-
- %%% Now again the design of |\@startsection| comes in hand: \LaTeX{}
- %%% always leaves a quad after the section number (by the way,
- %%% this is not mentioned in the documentation---you have to look
- %%% in the macros to figure this out). Because our section header
- %%% consists only of the number we have to code a value of $\rm
- %%% -0\,pt$\,\dots
-
- %%% \begin{quote}
- %%% Again: {\it non-orthogonal design is bad design}.
- %%% \end{quote}
-
- %%% \beginprog
- \def\sect{%
- \sect_intro
- \@startsection{section}{1}%
- {\z@}%
- {\pre_sect_skip}%
- {\m@ne sp}%
- {\normalsize\bf}%
- {\null}%
- }
- %%% \endprog
-
-
- %%% \sect We are finished and just have to restore the category code.
-
- %%% \beginprog
- \catcode`\_=\uscode
-
- \endinput
- %%% \endprog
-
-
-
-
-
- %%% \end{document}
-